package com.archway.appframe.frame.utils.gis;



/**
 * 地图经纬度距离计算工具
 * @author lirn-desk
 *
 */
public class MapRuler {
	
	/**
	 * 算法精确到50米以内
	 * 每隔 0.0001度，距离差11米
	 * 每隔0.001度，距离相差111米
	 */
	private static double EARTH_RADIUS = 6371137;// 地球半径

	public static void main(String[] args) {

		//{"lng":120.13996466965,"lat":30.219688233539}杭州动物园
		//{"lng":120.14147957207,"lat":30.222093412061}满陇桂雨公园
		//{"lng":120.13531692678,"lat":30.233525876943}杭州市职工休养院
		//{"lng":120.0818420574,"lat":30.320079842367}卡芭娅大酒店停车场
//		System.out.println(getDistance(30.233525876943, 120.13531692678, //杭州市职工休养院
//				30.222093412061, 120.14147957207));//满陇桂雨公园
//		System.out.println(getDistance(30.219688233539, 120.13996466965, //杭州动物园
//				30.222093412061, 120.14147957207));//满陇桂雨公园
//		System.out.println(getDistance(30.320079842367, 120.0818420574, //卡芭娅大酒店停车场
//				30.222093412061, 120.14147957207));//满陇桂雨公园
		
		//500米内精度测试  （市内测试时，精度最好保留4位） 
		//变化巨大
		System.out.println(getDistance(30.21, 120.13, //杭州动物园
				30.22, 120.14));//满陇桂雨公园
		//变化稍大
		System.out.println(getDistance(30.219, 120.139, //杭州动物园
				30.222, 120.141));//满陇桂雨公园
		//--变化微弱
		System.out.println(getDistance(30.2196, 120.1399, //杭州动物园
				30.2220, 120.1414));//满陇桂雨公园
		//----无变化
		System.out.println(getDistance(30.21968, 120.13996, //杭州动物园
				30.22209, 120.14147));//满陇桂雨公园
		System.out.println(getDistance(30.219688, 120.139964, //杭州动物园
				30.222093, 120.141479));//满陇桂雨公园
		System.out.println(getDistance(30.2196882, 120.1399646, //杭州动物园
				30.2220934, 120.1414795));//满陇桂雨公园
		System.out.println(getDistance(30.21968823, 120.13996466, //杭州动物园
				30.22209341, 120.14147957));//满陇桂雨公园

	}

	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

	/**
	 * 
	 * @param lat1
	 * @param lng1
	 * @param lat2
	 * @param lng2
	 * @return
	 */
	public static double getDistance(double lat1, double lng1, double lat2,double lng2) {
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
				+ Math.cos(radLat1) * Math.cos(radLat2)
				* Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000) / 10000;
		return s;
	}

}
